<script>
  //   给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串 s ，判断字符串是否有效。

  //   有效字符串需满足：

  //   左括号必须用相同类型的右括号闭合。
  //   左括号必须以正确的顺序闭合。

  // **** 题源：leetcode 20

  // 输入：s = "()[]{}"
  // 输出：true

  // 输入：s = "(]"
  // 输出：false

  // 特点 后入先出 操作 只对栈顶元素做操作
  /**
   * 分析
   * 有栈结构 这题和相邻的字符串思路 很像 也是判断 快入栈的元素 和 栈顶元素 进行一个比较
   * 然后 符合 () {} [] 就删除 只不过是多加了一些判断规则
   * 最后 根据栈的长度 即可返回结果
   */

  /**
   * @param {string} s
   * @return {boolean}
   */

  var isValid = function (s) {
    let stack = []; // 栈容器
    for (let k of s) {
      switch (k) {
        case '{':
        case '(':
        case '[':
          stack.push(k);
          break;
        case ')':
          if (stack[stack.length - 1] === '(') {
            stack.pop();
          } else {
            stack.push(k);
          }
          break;
        case ']':
          if (stack[stack.length - 1] === '[') {
            stack.pop();
          } else {
            stack.push(k);
          }
          break;
        case '}':
          if (stack[stack.length - 1] === '{') {
            stack.pop();
          } else {
            stack.push(k);
          }
          break;
      }
    }
    return stack.length ? false : true;
  };
  console.log(isValid('()[]{}'));
</script>
